home *** CD-ROM | disk | FTP | other *** search
- .TITLE KERMIT-65 Microtek SV-622 serial com card
- .SBTTL 6502 version - Ted Medin
-
- ; Version 1.0
-
- ; Based on the KERMIT Protocol.
-
- ; $Header: appmsv.m65,v 1.9 90/10/15 14:25:50 medin Locked $
- .SBTTL Define start address for assembly
-
- .=$1003 ; Start assembly at hex 1003
-
- .SBTTL Revision History
-
- ;
- ; Edit # Description
- ; ------ -----------
- ;
-
- ;$Log: appmsv.m65,v $
- Revision 1.9 90/10/15 14:25:50 medin
- new org of $7f00 for 3.87
- version 1.8
-
- ;Revision 1.8 88/12/22 09:40:58 medin
- ;use time constant for the wait routine
-
- ;Revision 1.7 88/08/16 16:20:30 medin
- ;fix break so it doesnt drop dtr
-
- ;Revision 1.6 88/02/06 21:45:13 medin
- ; Change output routine to check for input character before exiting.
-
- ;Revision 1.5 88/01/15 08:41:02 medin
- ;New origin for 3.81
-
- ;Revision 1.4 87/06/29 10:05:13 medin
- ; Change wait rtn to use apple rom rtn, change origin to $7600
-
- ;Revision 1.3 87/05/13 18:12:04 medin
- ; Change org to correspond with 3.76
-
- ;Revision 1.2 87/02/21 00:05:40 medin
- ; Put the version in the hearld so we can keep track of
- ;the com drivers also. Thanks Rhoda
-
- ; DONT FORGET TO UPDATE THE VERSION
- ;Revision 1.1 86/10/28 10:28:13 medin
- ;Initial revision
-
- ;
- ;
- ; Vector for com cards starts here
- ; location $1003 for data
- ; location $1020 for routine jumps
- ; location $1040 for main routines
- ;
- sscdbd: .blkb 1 ;contains baud index(ala super serial card) used by init
- ; 6 - 300 baud
- ; 7 - 600
- ; etc
- .blkb 1
- crdnam: .word herld ; null terminated string of who we are
- kersli: .blkb 1 ; com slot $n0
- kerins: .blkb 1 ; force initialization flag-when 0
- endker: .blkb 2 ; address of end of main kermit
- flowfg: .blkb 1 ; flow flag for xon/xoff controll b7=1 yes
- tl0end .word endcom ;[1.5] end of this routine
- timect .blkb 1 ;[1.7] 1 ms delay via rom wait rtn
- .=$1020 ; future expansion
- tlinit: jmp tl2int ; initialize com card
- tl0cmd: jmp tl2cmd ; command for ACIA in A
- ;
- ; 0 - hang up
- ; $0b - set baud
- ; $0c - set break on the line
- ; $91 - xon
- ; $93 - xoff
- ;
- ; routine will return false(0) if unable
- tl0cp: jmp tl2cp ; check for input ch ready-0 false
- tl0gpc: jmp tl2gpc ; get input ch
- tl0ppc: jmp tl2ppc ; put output character
- tl0exi: jmp tl2exi ; reset card and restore initialized
- .=$1040 ; futures
- ;[1.4]wait: .blkb 3 ; wait routine-a reg contains milliseconds
- wait: .blkb 3 ; rom wait rtn 220=125ms,206=108ms,25=2ms
- prstr: .blkb 3 ; print string x=lsb,y=msb x&y->null terminated string
- rdkey: .blkb 3 ; read keyboard
- prcrlf: .blkb 3 ; print cr and lf
- telcnc: .blkb 3 ; check for keyboard character
- telspa: .blkb 3 ; set character parity
-
- ;[1.4] .=$7200 ; place to start com card assembly
- .=$7f00 ;[1.8][1.5] place to start com card assembly
- start = . ;need a label at begining
- kr2pch = $c088 ;data port
- kr2pst = $c089 ;status port
- kr2pcr = $c08a ;command port
- kr2pcc = $c08b ;control port
- mncinb = $18 ; Control port init(8 bit,no par,1-stop,1200 baud)
- mnminb = $b ; Master port init(DTR, RTS, no interrupts)
- mssinb = $8 ; status bit for input ready
- mssoub = $10 ;status bit for output busy
- moutb = $c ; mask for the output bits of command
- moutnt = $4 ; command to start output with interupts
- pinptr: .byte ; input buffer pointer
- inptr: .byte ; input buffer pointer for get
- poutpt .byte ;[59] output buffer pointer
- outptr .byte ;[59] " " " for put
- kwrk01 .byte ;[1.7]
- irqsva = $45 ;place dos saves a reg
- hctrlq = $91 ;^Q with high bit on
- hctrls = $93 ;^S "
- ctrlq = $11 ;[59] ^Q
- ctrls = $13 ;[59] ^S
- dirq = $3fe ; interupt address
- sscstp = $578 ; +slot,bit 7 on turns off commands to ssc
- herld nasc <MICROTEK SV-622 V1.8> 1 ;tell who we are
- bad nasc <*****ERROR***** COM ROUTINES ASSEMBLED TOO LOW IN MEMORY> 1
-
- ;
- ; Microtek serial interface support - These routines support the
- ; SV-622 card
- ;
-
-
- tl2int:
- lda #start^
- cmp endker+1 ;are we loaded above main
- beq dontno ;cant tell yet
- bcc trble ;yes we are in trouble
- bcs setnm ;ok
- dontno lda #start\ ;well lets check 16 bits
- cmp endker
- beq setnm ;whee just exactly right
- bcs setnm ;ok
- trble ldx #bad\ ;got to tell someone
- ldy #bad^
- jsr prstr ;print the message
- jsr prcrlf ;and terminate it properly
- setnm:
- lda kerins
- bne tl2prr ; already initialized
- lda #0 ; clear pointers etc
- sta pinptr ; buffer starts at 0
- sta inptr ; buffer starts at 0
- sta poutpt ;[59] "
- sta outptr ;[59] "
- ldx kersli ;now for the slot $n0
- lda #mnminb ; Master port init
- sta kerins ; tell weve been here
- sta kr2pst,x ; Com port status
- sta kr2pcr,x ; Com master port
- lda #mncinb ; Control port init
- and #$f0 ; drop baud
- ora sscdbd ; and add default baud
- sta kr2pcc,x ;
- tl2prr: rts ; Return
-
-
- tl2cp: ldx kersli ; Offset into I/O locations
- tl2cp1: lda kr2pst,x ; Try for a character
- and #$08 ; Check for receive register full
- beq tl2cp7 ; no we dont have a ch
- lda kr2pch,x ; yes get ch
- ldy pinptr ; where to put it in buf
- sta inbuf,y ; save it
- inc pinptr ; ready for next ch
- bit flowfg ;[59] how about flow control
- bpl tl2cp7 ;[59] no
- lda inbuf,y ;[59] get input ch
- and #$7f ;[59] drop parity etc
- ; bvc tl2cp4 ;[59] yes,how about ^S received?, no
- cmp #ctrlq ;[59] is this continue(start up outputing)
- bne tl2cp4 ;[59] no, check for ^S
- lda flowfg ;[59] tattle about the continue
- and #$bf ;[59]
- sta flowfg ;[59]
- dec pinptr ;[59] forget about this character
- tl2cp2 ldy outptr ;[59] see if any to output
- cpy poutpt ;[59] well?
- beq tl2cp7 ;[59] no more we have put all
- tl2cp3 lda kr2pst,x ;[59] check status for output
- and #$10 ;[59] ready?
- beq tl2cp3 ;[59] no, spin
- lda outbuf,y ;[59] output ch
- sta kr2pch,x ;[59] bye
- inc outptr ;[59] ready for next
- jmp tl2cp2 ;[59]
- tl2cp4 cmp #ctrls ;[59] is this stop?
- bne tl2cp7 ;[59] no
- lda #$40 ;[59] yes, tattle
- ora flowfg ;[59]
- sta flowfg ;[59] now everyone knows
- dec pinptr ;[59] forget about the ^S character
- tl2cp7:
- lda pinptr
- cmp inptr
- rts ;return with false(0) or true(non 0)
-
- tl2gpc: ldx inptr ; get where it is in buf
- lda inbuf,x ; get the ch
- inc inptr ; ready for next get
- tl2rtc: rts ; and return
-
- tl2ppc: pha ; Hold the byte to send
- ldx kersli ; Get I/O location offset
- tl2pp1: lda kr2pst,x ; Get the status byte
- and #$10 ; Isolate the flag we want (TRE)
- beq tl2pp2 ; Transmit register is NOT empty, try again
- bit flowfg ;[59] flow control?
- bpl tl2pp0 ;[59] no
- bvc tl2pp0 ;[59] should we stop outputing?,no
- ldy poutpt ;[59] yes, save this ch in buffer
- pla ;[59]
- sta outbuf,y ;[59]
- inc poutpt ;[59] tell how many
- ;[1.6] rts ;[59] thats all
- jmp tl2cp1 ;[1.6] check for input and return
- tl2pp0 ;[59]
- pla ; Fetch the data byte off the stack
- sta kr2pch,x ; Stuff it at the proper loc to send it
- ;[1.6] rts ; and return
- jmp tl2cp1 ;[1.6] check for input and return
- tl2pp2: jsr tl2cp1 ; see if there is an input ch
- jmp tl2pp1 ;and try again
-
- tl2exi:
- lda #0 ;tell we did this
- sta kerins ;just in case init gets called
- ldx kersli ; get slot number
- sta kr2pst,x ;shut it down
- sta kr2pcr,x
- exit9: rts
- tl2cmd: ;find out what command
- beq tl2rts ;its drop line and we cant
- cmp #$0c
- beq break ;its a break command
- cmp #$0b
- beq baud ;its a set baud command
- cmp #hctrlq
- beq tl2sac ;its a xon command
- cmp #hctrls
- beq tl2sac ;its a xoff command
- tl2fls: lda #0 ;unknown command
- tl2rts: rts ;que passo ? return false(0)
- tl2sac: ldx flowfg ;do we have flow control
- bpl tl2fls ;no return false
- and #$7f ;drop high bit and send the ch
- jsr telspa ;set parity
- jsr tl2ppc ;output the ch
- lda #1 ;set true return
- rts
- baud: ldx kersli ; get slot number
- lda kr2pcc,x ; get com control
- and #$f0 ; and clear baud
- ora sscdbd ; enter
- sta kr2pcc,x ; and set new baud rate
- rts ;return true(non 0)
- break:
- ldy kersli ; ss card routine is not on
- lda kr2pcr,y ; get current command
- pha ;
- ;[1.7] lda #$c ;
- ora #$c ;[1.7] keep dtr up???
- sta kr2pcr,y ; start the break
- ;[1.4] lda #233 ; for 233 millseconds
- ;[1.4] jsr wait ; the y reg is not clobered
- ;[1.7] lda #220 ;[1.4] 125ms
- lda #233 ;[1.7] 233 ms
- sta kwrk01 ;[1.7]
- break3 lda timect ;[1.7] 1 ms at a time
- jsr wait ;[1.4]
- dec kwrk01 ;[1.7]
- bne break3 ;[1.7]
- ;[1.7] lda #206 ;[1.4] 108ms
- ;[1.7] jsr wait ;[1.4]
- pla ; restore command
- sta kr2pcr,y ;
- lda #1 ;return true
- rts
- inbuf .blkb 256 ;input buffer
- outbuf .blkb 256 ;[59] output "
- endcom ;[1.5]
-